home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_xemacs.idb / usr / freeware / lib / xemacs-20.4 / lisp / vm / vm-message.el.z / vm-message.el
Encoding:
Text File  |  1998-05-21  |  15.1 KB  |  328 lines

  1. ;;; Macros and functions dealing with accessing VM message struct fields
  2. ;;; Copyright (C) 1989-1997 Kyle E. Jones
  3. ;;;
  4. ;;; This program is free software; you can redistribute it and/or modify
  5. ;;; it under the terms of the GNU General Public License as published by
  6. ;;; the Free Software Foundation; either version 1, or (at your option)
  7. ;;; any later version.
  8. ;;;
  9. ;;; This program is distributed in the hope that it will be useful,
  10. ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ;;; GNU General Public License for more details.
  13. ;;;
  14. ;;; You should have received a copy of the GNU General Public License
  15. ;;; along with this program; if not, write to the Free Software
  16. ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18. (provide 'vm-message)
  19.  
  20. ;; data that is always shared with virtual folders
  21. (defmacro vm-location-data-of (message) (list 'aref message 0))
  22. ;; where message begins starting at the message separator in the folder
  23. (defmacro vm-start-of (message) (list 'aref (list 'aref message 0) 0))
  24. ;; where headers start (From_ line)
  25. (defmacro vm-headers-of (message) (list 'aref (list 'aref message 0) 1))
  26. ;; where visible headers start
  27. (defun vm-vheaders-of (message)
  28.   (or (aref (aref message 0) 2)
  29.       (progn (vm-reorder-message-headers message nil nil)
  30.          (aref (aref message 0) 2))))
  31. ;; where text section starts
  32. (defun vm-text-of (message)
  33.   (or (aref (aref message 0) 3) (progn (vm-find-and-set-text-of message)
  34.                        (aref (aref message 0) 3))))
  35. ;; where text portion of message ends
  36. (defmacro vm-text-end-of (message) (list 'aref (list 'aref message 0) 4))
  37. ;; where message ends
  38. (defmacro vm-end-of (message) (list 'aref (list 'aref message 0) 5))
  39. ;; soft data vector
  40. (defmacro vm-softdata-of (message) (list 'aref message 1))
  41. (defmacro vm-number-of (message) (list 'aref (list 'aref message 1) 0))
  42. (defmacro vm-padded-number-of (message) (list 'aref (list 'aref message 1) 1))
  43. (defmacro vm-mark-of (message) (list 'aref (list 'aref message 1) 2))
  44. ;; start of summary line
  45. (defmacro vm-su-start-of (message) (list 'aref (list 'aref message 1) 3))
  46. ;; end of summary line
  47. (defmacro vm-su-end-of (message) (list 'aref (list 'aref message 1) 4))
  48. ;; symbol whose value is the real message.
  49. (defmacro vm-real-message-sym-of (message)
  50.   (list 'aref (list 'aref message 1) 5))
  51. ;; real message
  52. (defmacro vm-real-message-of (message)
  53.   (list 'symbol-value (list 'aref (list 'aref message 1) 5)))
  54. ;; link to previous message in the message list
  55. (defmacro vm-reverse-link-of (message)
  56.   (list 'symbol-value (list 'aref (list 'aref message 1) 6)))
  57. ;; message type
  58. (defmacro vm-message-type-of (message) (list 'aref (list 'aref message 1) 7))
  59. ;; number that uniquely identifies each message
  60. ;; this is for the set handling stuff
  61. (defmacro vm-message-id-number-of (message)
  62.   (list 'aref (list 'aref message 1) 8))
  63. ;; folder buffer of this message
  64. (defmacro vm-buffer-of (message)
  65.   (list 'aref (list 'aref message 1) 9))
  66. ;; cache thread indentation value
  67. (defmacro vm-thread-indentation-of (message)
  68.   (list 'aref (list 'aref message 1) 10))
  69. ;; list of symbols from vm-thread-obarray that give this message's lineage
  70. (defmacro vm-thread-list-of (message)
  71.   (list 'aref (list 'aref message 1) 11))
  72. ;; babyl header frob flag (0 or 1 at beginning of message)
  73. (defmacro vm-babyl-frob-flag-of (message)
  74.   (list 'aref (list 'aref message 1) 12))
  75. ;; saved attributes, if message was switched from unmirrored to mirrored
  76. (defmacro vm-saved-virtual-attributes-of (message)
  77.   (list 'aref (list 'aref message 1) 13))
  78. ;; saved mirror data, if message was switched from unmirrored to mirrored
  79. (defmacro vm-saved-virtual-mirror-data-of (message)
  80.   (list 'aref (list 'aref message 1) 14))
  81. ;; summary for unmirrored virtual message
  82. (defmacro vm-virtual-summary-of (message)
  83.   (list 'aref (list 'aref message 1) 15))
  84. ;; MIME layout information; types, ids, positions, etc. of all MIME entities
  85. (defmacro vm-mime-layout-of (message)
  86.   (list 'aref (list 'aref message 1) 16))
  87. (defmacro vm-mime-encoded-header-flag-of (message)
  88.   (list 'aref (list 'aref message 1) 17))
  89. (defmacro vm-su-summary-mouse-track-overlay-of (message)
  90.   (list 'aref (list 'aref message 1) 18))
  91. ;; message attribute vector
  92. (defmacro vm-attributes-of (message) (list 'aref message 2))
  93. (defmacro vm-new-flag (message) (list 'aref (list 'aref message 2) 0))
  94. (defmacro vm-unread-flag (message) (list 'aref (list 'aref message 2) 1))
  95. (defmacro vm-deleted-flag (message) (list 'aref (list 'aref message 2) 2))
  96. (defmacro vm-filed-flag (message) (list 'aref (list 'aref message 2) 3))
  97. (defmacro vm-replied-flag (message) (list 'aref (list 'aref message 2) 4))
  98. (defmacro vm-written-flag (message) (list 'aref (list 'aref message 2) 5))
  99. (defmacro vm-forwarded-flag (message) (list 'aref (list 'aref message 2) 6))
  100. (defmacro vm-edited-flag (message) (list 'aref (list 'aref message 2) 7))
  101. (defmacro vm-redistributed-flag (message) (list 'aref (list 'aref message 2) 8))
  102. ;; message cached data
  103. (defmacro vm-cache-of (message) (list 'aref message 3))
  104. ;; message size in bytes (as a string)
  105. (defmacro vm-byte-count-of (message) (list 'aref (list 'aref message 3) 0))
  106. ;; weekday sent
  107. (defmacro vm-weekday-of (message) (list 'aref (list 'aref message 3) 1))
  108. ;; month day
  109. (defmacro vm-monthday-of (message) (list 'aref (list 'aref message 3) 2))
  110. ;; month sent
  111. (defmacro vm-month-of (message) (list 'aref (list 'aref message 3) 3))
  112. ;; year sent
  113. (defmacro vm-year-of (message) (list 'aref (list 'aref message 3) 4))
  114. ;; hour sent
  115. (defmacro vm-hour-of (message) (list 'aref (list 'aref message 3) 5))
  116. ;; timezone
  117. (defmacro vm-zone-of (message) (list 'aref (list 'aref message 3) 6))
  118. ;; message author's full name (Full-Name: or gouged from From:)
  119. (defmacro vm-full-name-of (message) (list 'aref (list 'aref message 3) 7))
  120. ;; message author address (gouged from From:)
  121. (defmacro vm-from-of (message) (list 'aref (list 'aref message 3) 8))
  122. ;; message ID (Message-Id:)
  123. (defmacro vm-message-id-of (message) (list 'aref (list 'aref message 3) 9))
  124. ;; number of lines in message (as a string)
  125. (defmacro vm-line-count-of (message) (list 'aref (list 'aref message 3) 10))
  126. ;; message subject (Subject:)
  127. (defmacro vm-subject-of (message) (list 'aref (list 'aref message 3) 11))
  128. ;; Regexp that can be used to find the start of the already ordered headers.
  129. (defmacro vm-vheaders-regexp-of (message)
  130.   (list 'aref (list 'aref message 3) 12))
  131. ;; Addresses of recipients in a comma separated list
  132. (defmacro vm-to-of (message) (list 'aref (list 'aref message 3) 13))
  133. ;; Full names of recipients in a comma separated list.  Addresses if
  134. ;; full names not available.
  135. (defmacro vm-to-names-of (message) (list 'aref (list 'aref message 3) 14))
  136. ;; numeric month sent
  137. (defmacro vm-month-number-of (message) (list 'aref (list 'aref message 3) 15))
  138. ;; sortable date string (used for easy sorting, naturally)
  139. (defmacro vm-sortable-datestring-of (message)
  140.   (list 'aref (list 'aref message 3) 16))
  141. ;; sortable subject, re: garbage removed
  142. (defmacro vm-sortable-subject-of (message)
  143.   (list 'aref (list 'aref message 3) 17))
  144. ;; tokenized summary entry
  145. (defmacro vm-summary-of (message)
  146.   (list 'aref (list 'aref message 3) 18))
  147. ;; parent of this message, as determined by threading
  148. (defmacro vm-parent-of (message)
  149.   (list 'aref (list 'aref message 3) 19))
  150. ;; message IDs parsed from References header
  151. (defmacro vm-references-of (message)
  152.   (list 'aref (list 'aref message 3) 20))
  153. ;; extra data shared by virtual messages if vm-virtual-mirror is non-nil
  154. (defmacro vm-mirror-data-of (message) (list 'aref message 4))
  155. ;; if message is being edited, this is the buffer being used.
  156. (defmacro vm-edit-buffer-of (message) (list 'aref (list 'aref message 4) 0))
  157. ;; list of virtual messages mirroring the underlying real message
  158. (defmacro vm-virtual-messages-of (message)
  159.   (list 'symbol-value (list 'aref (list 'aref message 4) 1)))
  160. ;; modification flag for this message
  161. ;; nil if all attribute changes have been stuffed into the folder buffer
  162. (defmacro vm-modflag-of (message) (list 'aref (list 'aref message 4) 2))
  163. ;; list of labels attached to this message
  164. (defmacro vm-labels-of (message) (list 'aref (list 'aref message 4) 3))
  165. ;; comma list of labels
  166. (defmacro vm-label-string-of (message) (list 'aref (list 'aref message 4) 4))
  167.  
  168. (defmacro vm-set-location-data-of (message vdata) (list 'aset message 0 vdata))
  169. (defmacro vm-set-start-of (message start)
  170.   (list 'aset (list 'aref message 0) 0 start))
  171. (defmacro vm-set-headers-of (message h)
  172.   (list 'aset (list 'aref message 0) 1 h))
  173. (defmacro vm-set-vheaders-of (message vh)
  174.   (list 'aset (list 'aref message 0) 2 vh))
  175. (defmacro vm-set-text-of (message text)
  176.   (list 'aset (list 'aref message 0) 3 text))
  177. (defmacro vm-set-text-end-of (message text)
  178.   (list 'aset (list 'aref message 0) 4 text))
  179. (defmacro vm-set-end-of (message end)
  180.   (list 'aset (list 'aref message 0) 5 end))
  181. (defmacro vm-set-softdata-of (message data)
  182.   (list 'aset message 1 data))
  183. (defmacro vm-set-number-of (message n)
  184.   (list 'aset (list 'aref message 1) 0 n))
  185. (defmacro vm-set-padded-number-of (message n)
  186.   (list 'aset (list 'aref message 1) 1 n))
  187. (defmacro vm-set-mark-of (message val)
  188.   (list 'aset (list 'aref message 1) 2 val))
  189. (defmacro vm-set-su-start-of (message pos)
  190.   (list 'aset (list 'aref message 1) 3 pos))
  191. (defmacro vm-set-su-end-of (message pos)
  192.   (list 'aset (list 'aref message 1) 4 pos))
  193. (defmacro vm-set-real-message-sym-of (message sym)
  194.   (list 'aset (list 'aref message 1) 5 sym))
  195. (defmacro vm-set-reverse-link-of (message link)
  196.   (list 'set (list 'aref (list 'aref message 1) 6) link))
  197. (defmacro vm-set-reverse-link-sym-of (message sym)
  198.   (list 'aset (list 'aref message 1) 6 sym))
  199. (defmacro vm-set-message-type-of (message type)
  200.   (list 'aset (list 'aref message 1) 7 type))
  201. (defmacro vm-set-message-id-number-of (message number)
  202.   (list 'aset (list 'aref message 1) 8 number))
  203. (defmacro vm-set-buffer-of (message buffer)
  204.   (list 'aset (list 'aref message 1) 9 buffer))
  205. (defmacro vm-set-thread-indentation-of (message val)
  206.   (list 'aset (list 'aref message 1) 10 val))
  207. (defmacro vm-set-thread-list-of (message list)
  208.   (list 'aset (list 'aref message 1) 11 list))
  209. (defmacro vm-set-babyl-frob-flag-of (message flag)
  210.   (list 'aset (list 'aref message 1) 12 flag))
  211. (defmacro vm-set-saved-virtual-attributes-of (message attrs)
  212.   (list 'aset (list 'aref message 1) 13 attrs))
  213. (defmacro vm-set-saved-virtual-mirror-data-of (message data)
  214.   (list 'aset (list 'aref message 1) 14 data))
  215. (defmacro vm-set-virtual-summary-of (message summ)
  216.   (list 'aset (list 'aref message 1) 15 summ))
  217. (defmacro vm-set-mime-layout-of (message layout)
  218.   (list 'aset (list 'aref message 1) 16 layout))
  219. (defmacro vm-set-mime-encoded-header-flag-of (message flag)
  220.   (list 'aset (list 'aref message 1) 17 flag))
  221. (defmacro vm-set-su-summary-mouse-track-overlay-of (message overlay)
  222.   (list 'aset (list 'aref message 1) 18 overlay))
  223. (defmacro vm-set-attributes-of (message attrs) (list 'aset message 2 attrs))
  224. ;; The other routines in attributes group are part of the undo system.
  225. (defun vm-set-edited-flag-of (message flag)
  226.   (aset (aref message 2) 7 flag)
  227.   (vm-mark-for-summary-update message)
  228.   (if (eq vm-flush-interval t)
  229.       (vm-stuff-virtual-attributes message)
  230.     (vm-set-modflag-of message t))
  231.   (and (not (buffer-modified-p)) (vm-set-buffer-modified-p t))
  232.   (vm-clear-modification-flag-undos))
  233. (defmacro vm-set-cache-of (message cache) (list 'aset message 3 cache))
  234. (defmacro vm-set-byte-count-of (message count)
  235.   (list 'aset (list 'aref message 3) 0 count))
  236. (defmacro vm-set-weekday-of (message val)
  237.   (list 'aset (list 'aref message 3) 1 val))
  238. (defmacro vm-set-monthday-of (message val)
  239.   (list 'aset (list 'aref message 3) 2 val))
  240. (defmacro vm-set-month-of (message val)
  241.   (list 'aset (list 'aref message 3) 3 val))
  242. (defmacro vm-set-year-of (message val)
  243.   (list 'aset (list 'aref message 3) 4 val))
  244. (defmacro vm-set-hour-of (message val)
  245.   (list 'aset (list 'aref message 3) 5 val))
  246. (defmacro vm-set-zone-of (message val)
  247.   (list 'aset (list 'aref message 3) 6 val))
  248. (defmacro vm-set-full-name-of (message author)
  249.   (list 'aset (list 'aref message 3) 7 author))
  250. (defmacro vm-set-from-of (message author)
  251.   (list 'aset (list 'aref message 3) 8 author))
  252. (defmacro vm-set-message-id-of (message id)
  253.   (list 'aset (list 'aref message 3) 9 id))
  254. (defmacro vm-set-line-count-of (message count)
  255.   (list 'aset (list 'aref message 3) 10 count))
  256. (defmacro vm-set-subject-of (message subject)
  257.   (list 'aset (list 'aref message 3) 11 subject))
  258. (defmacro vm-set-vheaders-regexp-of (message regexp)
  259.   (list 'aset (list 'aref message 3) 12 regexp))
  260. (defmacro vm-set-to-of (message recips)
  261.   (list 'aset (list 'aref message 3) 13 recips))
  262. (defmacro vm-set-to-names-of (message recips)
  263.   (list 'aset (list 'aref message 3) 14 recips))
  264. (defmacro vm-set-month-number-of (message val)
  265.   (list 'aset (list 'aref message 3) 15 val))
  266. (defmacro vm-set-sortable-datestring-of (message val)
  267.   (list 'aset (list 'aref message 3) 16 val))
  268. (defmacro vm-set-sortable-subject-of (message val)
  269.   (list 'aset (list 'aref message 3) 17 val))
  270. (defmacro vm-set-summary-of (message val)
  271.   (list 'aset (list 'aref message 3) 18 val))
  272. (defmacro vm-set-parent-of (message val)
  273.   (list 'aset (list 'aref message 3) 19 val))
  274. (defmacro vm-set-references-of (message val)
  275.   (list 'aset (list 'aref message 3) 20 val))
  276. (defmacro vm-set-mirror-data-of (message data)
  277.   (list 'aset message 4 data))
  278. (defmacro vm-set-edit-buffer-of (message buf)
  279.   (list 'aset (list 'aref message 4) 0 buf))
  280. (defmacro vm-set-virtual-messages-of (message list)
  281.   (list 'set (list 'aref (list 'aref message 4) 1) list))
  282. (defmacro vm-set-virtual-messages-sym-of (message sym)
  283.   (list 'aset (list 'aref message 4) 1 sym))
  284. (defmacro vm-set-modflag-of (message val)
  285.   (list 'aset (list 'aref message 4) 2 val))
  286. (defmacro vm-set-labels-of (message labels)
  287.   (list 'aset (list 'aref message 4) 3 labels))
  288. (defmacro vm-set-label-string-of (message string)
  289.   (list 'aset (list 'aref message 4) 4 string))
  290.  
  291. (defun vm-make-message ()
  292.   (let ((v (make-vector 5 nil)) sym)
  293.     (vm-set-softdata-of v (make-vector vm-softdata-vector-length nil))
  294.     (vm-set-location-data-of
  295.      v (make-vector vm-location-data-vector-length nil))
  296.     (vm-set-mirror-data-of v (make-vector vm-mirror-data-vector-length nil))
  297.     (vm-set-message-id-number-of v (int-to-string vm-message-id-number))
  298.     (vm-increment vm-message-id-number)
  299.     (vm-set-buffer-of v (current-buffer))
  300.     ;; We use an uninterned symbol here as a level of indirection
  301.     ;; from a purely self-referential structure.  This is
  302.     ;; necessary so that Emacs debugger can be used on this
  303.     ;; program.
  304.     (setq sym (make-symbol "<<>>"))
  305.     (set sym v)
  306.     (vm-set-real-message-sym-of v sym)
  307.     ;; Another uninterned symbol for the virtual messages list.
  308.     (setq sym (make-symbol "<v>"))
  309.     (set sym nil)
  310.     (vm-set-virtual-messages-sym-of v sym)
  311.     ;; Another uninterned symbol for the reverse link 
  312.     ;; into the message list.
  313.     (setq sym (make-symbol "<--"))
  314.     (vm-set-reverse-link-sym-of v sym)
  315.     v ))
  316.  
  317. (defun vm-find-and-set-text-of (m)
  318.   (save-excursion
  319.     (set-buffer (vm-buffer-of m))
  320.     (save-restriction
  321.       (widen)
  322.       (goto-char (vm-headers-of m))
  323.       (search-forward "\n\n" (vm-text-end-of m) 0)
  324.       (vm-set-text-of m (point-marker)))))
  325.  
  326. (defun vm-virtual-message-p (m)
  327.   (not (eq m (vm-real-message-of m))))
  328.